﻿using System;
using FTools.Persistencia;
using System.Data.SqlClient;
using FTools.Interface;
using FTools.Dominio;
using System.Collections;
using FTools.Generico;

namespace FTools.Comunicacion
{
    class ComPersonaFisica : InterfacePersonaFisica
    {
        Conexion objConexion = new Conexion();
        SqlConnection conexion;
        SqlTransaction transaccion = null;
        PerPersonaFisica objPerPersonaFisica = new PerPersonaFisica();

        //OBTENER PERSONA FISICA
        public PersonaFisica obtenerPersonaFisica(long xIdPersona)
        {
            try
            {
                PerPersona objPerPersona = new PerPersona();
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                PersonaFisica objPersonaFisica = objPerPersonaFisica.obtenerPersonaFisica(conexion, transaccion, xIdPersona);
                if (objPerPersona.existePersona(conexion, transaccion, xIdPersona))
                {
                    Persona objPersona = objPerPersona.obtenerPersona(conexion, transaccion, xIdPersona);
                    objPersonaFisica.Direccion = objPersona.Direccion;
                    objPersonaFisica.Puerta = objPersona.Puerta;
                    objPersonaFisica.Complemento = objPersona.Complemento;
                    objPersonaFisica.Cp = objPersona.Cp;
                    objPersonaFisica.Telefono = objPersona.Telefono;
                    objPersonaFisica.Celular = objPersona.Celular;
                    objPersonaFisica.Email = objPersona.Email;
                    objPersonaFisica.Tipo = objPersona.Tipo;
                    objPersonaFisica.ObjCiudad = objPersona.ObjCiudad;
                }
                transaccion.Commit();
                return objPersonaFisica;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        //EXISTE PERSONA FISICA
        public Boolean existePersonaFisica(long xIdPersona)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Boolean existe = objPerPersonaFisica.existePersonaFisica(conexion, transaccion, xIdPersona);
                transaccion.Commit();
                return existe;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        //OBTENER COLECCION PERSONA FISICA
        public ArrayList obtenerColeccionPersonaFisica()
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colPersonaFisica = objPerPersonaFisica.obtenerColeccionPersonaFisica(conexion, transaccion);
                PerPersona objPerPersona = new PerPersona();
                foreach (PersonaFisica objPersonaFisica in colPersonaFisica)
                {
                    if (objPerPersona.existePersona(conexion, transaccion, objPersonaFisica.IdPersona))
                    {
                        Persona objPersona = objPerPersona.obtenerPersona(conexion, transaccion, objPersonaFisica.IdPersona);
                        objPersonaFisica.Direccion = objPersona.Direccion;
                        objPersonaFisica.Puerta = objPersona.Puerta;
                        objPersonaFisica.Complemento = objPersona.Complemento;
                        objPersonaFisica.Cp = objPersona.Cp;
                        objPersonaFisica.Telefono = objPersona.Telefono;
                        objPersonaFisica.Celular = objPersona.Celular;
                        objPersonaFisica.Email = objPersona.Email;
                        objPersonaFisica.Tipo = objPersona.Tipo;
                        objPersonaFisica.ObjCiudad = objPersona.ObjCiudad;
                    }
                }
                transaccion.Commit();
                return colPersonaFisica;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        //OBTENER BUSQUEDA PERSONA FISICA
        public ArrayList obtenerBusquedaPersonaFisica(String xDocumento, String xApellido1, String xApellido2, String xNombre1, String xNombre2)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colPersonaFisica = objPerPersonaFisica.obtenerBusquedaPersonaFisica(conexion, transaccion, xDocumento, xApellido1, xApellido2, xNombre1, xNombre2);
                PerPersona objPerPersona = new PerPersona();
                foreach (PersonaFisica objPersonaFisica in colPersonaFisica)
                {
                    if (objPerPersona.existePersona(conexion, transaccion, objPersonaFisica.IdPersona))
                    {
                        Persona objPersona = objPerPersona.obtenerPersona(conexion, transaccion, objPersonaFisica.IdPersona);
                        objPersonaFisica.Direccion = objPersona.Direccion;
                        objPersonaFisica.Puerta = objPersona.Puerta;
                        objPersonaFisica.Complemento = objPersona.Complemento;
                        objPersonaFisica.Cp = objPersona.Cp;
                        objPersonaFisica.Telefono = objPersona.Telefono;
                        objPersonaFisica.Celular = objPersona.Celular;
                        objPersonaFisica.Email = objPersona.Email;
                        objPersonaFisica.Tipo = objPersona.Tipo;
                        objPersonaFisica.ObjCiudad = objPersona.ObjCiudad;
                    }
                }
                transaccion.Commit();
                return colPersonaFisica;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        //ALTA PERSONA FISICA
        public int altaPersonaFisica(PersonaFisica xObjPersonaFisica)
        {
            
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                long idPersona = FuncionesGenericas.generarNumerador("PERSONA");
                xObjPersonaFisica.IdPersona = idPersona;
                //DATOS PERSONA
                Persona objPersona = new Persona();
                PerPersona objPerPersona = new PerPersona();
                objPersona.IdPersona = xObjPersonaFisica.IdPersona;
                String nombre = xObjPersonaFisica.Apellido1 + " " + xObjPersonaFisica.Apellido2 + ", " + xObjPersonaFisica.Nombre1 + " " + xObjPersonaFisica.Nombre2;
                objPersona.Nombre = nombre;
                objPersona.Direccion = xObjPersonaFisica.Direccion;
                objPersona.Puerta = xObjPersonaFisica.Puerta;
                objPersona.Complemento = xObjPersonaFisica.Complemento;
                objPersona.Cp = xObjPersonaFisica.Cp;
                objPersona.Telefono = xObjPersonaFisica.Telefono;
                objPersona.Celular = xObjPersonaFisica.Celular;
                objPersona.Email = xObjPersonaFisica.Email;
                objPersona.Tipo = xObjPersonaFisica.Tipo;
                objPersona.ObjCiudad = xObjPersonaFisica.ObjCiudad;
                objPerPersona.altaPersona(conexion, transaccion, objPersona);//ALTA PERSONA
                //
                int res = objPerPersonaFisica.altaPersonaFisica(conexion, transaccion, xObjPersonaFisica);
                transaccion.Commit();
                return res;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        //BAJA PERSONA FISICA
        public int bajaPersonaFisica(PersonaFisica xObjPersonaFisica)
        {
            SqlTransaction transaccion = null;
            try
            {
                Persona objPersona = new Persona();
                PerPersona objPerPersona = new PerPersona();
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                int res = objPerPersonaFisica.bajaPersonaFisica(conexion, transaccion, xObjPersonaFisica);
                if (objPerPersona.existePersona(conexion, transaccion, xObjPersonaFisica.IdPersona))
                {
                    objPersona = objPerPersona.obtenerPersona(conexion, transaccion, xObjPersonaFisica.IdPersona);
                    objPerPersona.bajaPersona(conexion, transaccion, objPersona);//BAJA PERSONA
                }
                transaccion.Commit();
                return res;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        //MODIFICA PERSONA FISICA
        public int modificaPersonaFisica(PersonaFisica xObjPersonaFisica)
        {
            SqlTransaction transaccion = null;
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Persona objPersona = new Persona();
                PerPersona objPerPersona = new PerPersona();
                if (objPerPersona.existePersona(conexion, transaccion, xObjPersonaFisica.IdPersona))
                {
                    objPersona.IdPersona = xObjPersonaFisica.IdPersona;
                    String nombre = xObjPersonaFisica.Apellido1 + " " + xObjPersonaFisica.Apellido2 + ", " + xObjPersonaFisica.Nombre1 + " " + xObjPersonaFisica.Nombre2;
                    objPersona.Nombre = nombre;
                    objPersona.Direccion = xObjPersonaFisica.Direccion;
                    objPersona.Puerta = xObjPersonaFisica.Puerta;
                    objPersona.Complemento = xObjPersonaFisica.Complemento;
                    objPersona.Cp = xObjPersonaFisica.Cp;
                    objPersona.Telefono = xObjPersonaFisica.Telefono;
                    objPersona.Celular = xObjPersonaFisica.Celular;
                    objPersona.Email = xObjPersonaFisica.Email;
                    objPersona.Tipo = xObjPersonaFisica.Tipo;
                    objPersona.ObjCiudad = xObjPersonaFisica.ObjCiudad;
                    objPerPersona.modificaPersona(conexion, transaccion, objPersona);//MODIFICA PERSONA
                }
                int res = objPerPersonaFisica.modificaPersonaFisica(conexion, transaccion, xObjPersonaFisica);
                transaccion.Commit();
                return res;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }
    }
}
